// modifica di una funzione template


#include <iostream>
using namespace std;

template <class X> void swapargs(X &a, X &b)
{
	X temp;

	temp = a;
	a = b;
	b = temp;
	cout << "Nel template di swapargs(int &, int &).\n";
}

// questa versione nasconde la versione generica di swapargs().
void swapargs(int &a, int &b)
{
	int temp;

	temp =a;
	a = b;
	b = temp;
	cout << "Nella specializzazione int di swapargs(int &, int &).\n";
}

int main()
{
	int i=10, j=20;
	float x=10.1, y=23.3;
	char a='x',b='z';

	cout << "i e j originali:  " << i << ' ' << j << endl;
	cout << "x e y originali:  " << x << ' ' << y << endl;
	cout << "a e b originali:  " << a << ' ' << b << "\n\n\n\n";

	swapargs(i, j); // richiama la swapargs() modificata tramite overloading
	swapargs(x, y); // richiama la swapargs() generica
	swapargs(a, b); // richiama la swapargs() generica

	cout << "\n\n\ni e j scambiati:  " << i << ' ' << j << endl;
	cout << "x e y scambiati:  " << x << ' ' << y << endl;
	cout << "a e b scambiati:  " << a << ' ' << b << "\n\n";

	return 0;
}

/* si puo' usare la nuova forma sintattica, per cui swapargs() si puo' scrivere come:

  template <> void swapargs<int>(int &a, int &b)
  {
	int temp;

  	temp =a;
	a = b;
	b = temp;
	cout << "In swapargs con specializzazione int.\n";
}
*/